<?php

namespace App\Http\Controllers\Api;

use Illuminate\Http\Request;
use App\Http\Controllers\Controller;

/**
 * Desc: xunsearch迅搜控制器
 * Author: zjj [978793496@qq.com]
 * Date: 2017-11-04
 */
class SearchApi extends Controller
{
    // XS实例化对象
    protected $xs;

    //模糊搜索
    protected $fuzzy;

    //同义词搜索
    protected $synonyms;

    // (实例化对象)接收的是 $xs->search 的返回值
    protected $search;

    /**
     * __construct description
     * @param string  $configFile xunsearch的配置文件名
     * @param boolean $fuzzy      模糊搜索 true为开启 false关闭
     * @param boolean $synonyms   同义词搜索 true为开启 false关闭
     */
    public function __construct(
      $configFile = 'abc',
      $fuzzy = true,
      $synonyms = true
    ){
        define ('XS_APP_ROOT', '/usr/local/apache2/htdocs/shop/vendor/hightman/xunsearch/app');

        $this->xs = new \XS($configFile);
        $this->fuzzy = $fuzzy;
        $this->synonyms = $synonyms;

        //获取搜索操作对象（ XSComponent 的子类）
        $this->search = $this->xs->search;
    }

    /**
     * doSearch 使用xunsearch进行搜索
     * @param  string $keyword 搜索词语 用户从表单填写的要搜索的内容
     * @return array           搜索结果
     */
    public function doSearch($keyword)
    {

        $this->search
             ->setFuzzy($this->fuzzy)
             ->setAutoSynonyms($this->synonyms);

        //设置搜索语句
        $this->search->setQuery($keyword);

        //执行搜索，将搜索结果文档保存在 $docs 数组中
        $docs =  $this->search->search();

        if(count($docs) == 0){

          // 没有找到搜索结果
          return array();
        }

        //将结果一一取出
        foreach($docs as $k => $doc){
            if(!empty($doc)){
                //取出搜索结果
                $searchRes[] = $doc->getFields();

                //获取每个词的权重
                $searchRes[$k]['weight'] = $doc->weight();
            }
        }

        return $searchRes;

    }

    /**
     * addDocumentData 添加数据到xunsearch索引服务器
     * @param array $data 如果需要将商品名加入搜索服务器，就传递
     * $data = ['gname' => '你的商品名'], gname需要与xunsearch配置文件中一致
     *
     * @return  void
     */
    public function addDocumentData( $data = array() )
    {
        if ( empty($data) ) {
          throw new \Exception('请输入插入数据');
        }

        // 创建文档对象
        $doc = new \XSDocument;

        $doc->setFields($data);

        //添加数据到xunsearch索引数据库中（ $xs->index 获取索引操作对象）
        $this->xs->index->add($doc)->flushIndex();
    }

    /**
     * updateDocumentData 更新、修改xunsearch索引服务器中的索引
     * @param array $data 如果需要更新、修改索引服务器中的索引，就传递
     * $data = ['gname' => '你的商品名'], gname需要与xunsearch配置文件中一致
     *
     * @return  void
     */
    public function updateDocumentData($data = array())
    {
        if ( empty($data) ) {
          throw new \Exception('请输入更新的索引数据');
        }

        // 创建文档对象
        $doc = new \XSDocument;

        $doc->setFields($data);

        //更新xunsearch索引数据库中的数据（ $xs->index 获取索引操作对象）
        $this->xs->index->update($doc)->flushIndex();
    }

    /**
     * deleteDocumentData （单条、多条）删除xunsearch索引服务器中的索引
     * @param int/array $marks 如果需要删除索引服务器中的索引，就传递主键ID，也可以是多个ID组成的数组
     * 例如 $mark = '123', 或者 $marks = ['123', '456', 789]
     *
     * @return  void
     */
    public function deleteDocumentData($id)
    {
        if ( empty($id) ) {
          throw new \Exception('请选择要删除的索引数据');
        }

        //更新xunsearch索引数据库中的数据（ $xs->index 获取索引操作对象）
        $this->xs->index->del($id)->flushIndex();
    }

    /*
    * 获取热门搜索
    */
    public function getHot()
    {

        //调用热门搜索方法
        $arr = $this->search->getHotQuery();

        return $arr;

    }

}
